<?php

/**
 * Classe représentant d'un étudiant.
 * @author CHAGNON Laura
 * @since 25 septembre 2013
 * @version 1.0
 */

class Etudiants
{
		/*Attributs*/

	/**
	 * ID de l'étudiant
	 * @var int
	 */
	private $_id;

	/**
	 * Login de l'étudiant
	 * @var string
	 */
	private $_login;

	/**
	 * Nom de l'étudiant
	 * @var string
	 */
	private $_nom;

	/**
	 * Prenom de l'étudiant
	 * @var string
	 */
	private $_prenom;

	/**
	 * TD associé à l'étudiant
	 * @var string
	 */
	private $_td;

	/**
	 * Année de la promos de l'étudiant
	 * @var int
	 */
	private $_annee;

	/**
	 * Mail de l'étudiant
	 * @var string
	 */
	private $_mail;

	/*Constructeur */
	public function __construct()
	{
		$args = func_get_args();

		switch(func_num_args())
		{
			case 1:
				if(is_numeric($args[0]))
					$this->set_id($args[0]);
				else
					$this->set_login($args[0]);
				break;
			case 5:
				$this->set_id($args[0]);
				$this->set_nom($args[1]);
				$this->set_prenom($args[2]);
				$this->set_td($args[3]);
				$this->set_annee($args[4]);
				break;
			case 6:
				$this->set_login($args[0]);
				$this->set_nom($args[1]);
				$this->set_prenom($args[2]);
				$this->set_mail($args[3]);
				$this->set_td($args[4]);
				$this->set_annee($args[5]);
				break;
			case 7:
				$this->set_id($args[0]);
				$this->set_login($args[1]);
				$this->set_nom($args[2]);
				$this->set_prenom($args[3]);
				$this->set_mail($args[4]);
				$this->set_td($args[5]);
				$this->set_annee($args[6]);
				break;
			case 2:
				$this->set_nom($args[0]);
				$this->set_prenom($args[1]);
				break;
			default:
				trigger_error('Constructeur de l\'étudiant avec ' + func_num_args() + ' non défini.');
				break;
		}
	}

	/*methodes*/
	/**
	 * Permet de mofifier l'objet actuel en récupérant toutes ses informations.
	 */
	public function getOneEtudiant()
	{
		$bdd = PDO2::getInstance();
		if(is_null($this->get_id()))
			$don = $bdd->query('SELECT E.'.LOGIN_ETU.', E.'.ID_ETU.', '.NOM_ETU.', '.PRENOM_ETU.', '.MAIL_ETU.', '.ANNEE_ETU_PROMO.', '.TD_ETU_PROMO. '
											FROM '.TABLE_ETUDIANT.' E
												JOIN '.TABLE_ETUDIANT_PROMO.' EP ON E.'.ID_ETU.' = EP.'.ETU_ID_PROMO.'
											WHERE E.'.LOGIN_ETU.' = \''.$this->get_login().'\'');
		else
			$don = $bdd->query('SELECT E.'.LOGIN_ETU.', E.'.ID_ETU.', '.NOM_ETU.', '.PRENOM_ETU.', '.MAIL_ETU.', '.ANNEE_ETU_PROMO.', '.TD_ETU_PROMO. '
											FROM '.TABLE_ETUDIANT.' E
												JOIN '.TABLE_ETUDIANT_PROMO.' EP ON E.'.ID_ETU.' = EP.'.ETU_ID_PROMO.'
											WHERE E.'.ID_ETU.' = \''.$this->get_id().'\'');

		$d = $don->fetch();
		$don->closeCursor();
		$this->set_id($d[ID_ETU]);
		$this->set_login($d[LOGIN_ETU]);
		$this->set_nom($d[NOM_ETU]);
		$this->set_prenom($d[PRENOM_ETU]);
		$this->set_mail($d[MAIL_ETU]);
		$this->set_td($d[TD_ETU_PROMO]);
		$this->set_annee($d[ANNEE_ETU_PROMO]);
	}

	public function getOneEtudiantFromArchive()
	{
		$bdd = PDO2::getInstance();
		
		$don = $bdd->query('SELECT E.'.LOGIN_ETU.', E.'.ID_ETU.', '.NOM_ETU.', '.PRENOM_ETU.', '.MAIL_ETU.', '.ANNEE_ETU_PROMO.', '.TD_ETU_PROMO. '
										FROM '.TABLE_ETUDIANT.'_archive E
											JOIN '.TABLE_ETUDIANT_PROMO.'_archive EP ON E.'.ID_ETU.' = EP.'.ETU_ID_PROMO.'
										WHERE E.'.ID_ETU.' = \''.$this->get_id().'\'');
	
		$d = $don->fetch();
		$don->closeCursor();
		$this->set_id($d[ID_ETU]);
		$this->set_login($d[LOGIN_ETU]);
		$this->set_nom($d[NOM_ETU]);
		$this->set_prenom($d[PRENOM_ETU]);
		$this->set_mail($d[MAIL_ETU]);
		$this->set_td($d[TD_ETU_PROMO]);
		$this->set_annee($d[ANNEE_ETU_PROMO]);
	}
	
	/**
	 * Permet de récupérer tous les étudiants
	 */
	public static function getAllEtudiant()
	{
		$etu = false;
		$bdd = PDO2::getInstance();
		$donnees = $bdd->query('SELECT E.'.ID_ETU.', E.'.NOM_ETU.', E.'.PRENOM_ETU.', EP.'.ANNEE_ETU_PROMO.', EP.'.TD_ETU_PROMO. '
											FROM '.TABLE_ETUDIANT.' E
												JOIN '.TABLE_ETUDIANT_PROMO.' EP ON E.'.ID_ETU.' = EP.'.ETU_ID_PROMO);
		$donnees = $donnees->fetchAll();
		foreach($donnees as $d)
		{
			$etu[] = new Etudiants($d[ID_ETU], $d[NOM_ETU], $d[PRENOM_ETU], $d[ANNEE_ETU_PROMO], $d[TD_ETU_PROMO]);
		}
		return $etu;
	}

	/**
	 * Permet de savoir si un login passé en paramètre est étuidiant
	 * @param string $userLogin Le login à tester
	 * @return boolean true si le login existe, false sinon.
	 */
	public static function etu_exist($userLogin)
	{
		$bdd = PDO2::getInstance();
		$donnees = $bdd->query(	'
				SELECT *
				FROM '.TABLE_ETUDIANT.'
				WHERE '.LOGIN_ETU.' = \''.$userLogin.'\'
				');

		if($donnees->rowCount() == 1)
			return true;
		else
			return false;
	}

	/**
	 * Permet de savoir si l'étudiant participe à l'action de communication passé en paramètre.
	 * @param int $idADC Identifiant de l'action de communication dont l'étudiant est susceptible de participer
	 * @return boolean true si l'étudiant participe sinon false
	 */
	public function is_participeADC($idADC)
	{
		$bdd = PDO2::getInstance();
		$donnees = $bdd->query(	'
									SELECT COUNT(*)
									FROM '.TABLE_PARTICIPE.'
									WHERE '.ID_ETU_PARTICIPE.' = '.$this->get_id().'
										AND '.ID_ADC_PARTICIPE.' = '.$idADC.'
								');
		if( $donnees->fetchColumn() > 0)
			return true;
		else
			return false;
	}

	/**
	 * fonction permettant de confirmer la fiche bilan de l'action de l'étudiant
	 * @param int $idADC Identifiant de l'action de communication où l'étudiant s'est inscrit
	 */
	public function confirmationFBA($idADC)
	{
		$bdd = PDO2::getInstance();
		$donnees = $bdd->query(
				' UPDATE '.TABLE_PARTICIPE.
				' SET '.CONFIRM_FICHE_ADC.' =  1
								WHERE '.ID_ETU_PARTICIPE.' = '.$this->get_id().'
									AND '.ID_ADC_PARTICIPE.' = '.$idADC
		);
	}

	/**
	 * fonction permettant de savoir si l'étudiant a participer a l'action
	 * @param int $idADC Identifiant de l'action de communication où l'étudiant s'est inscrit
	 * @return boolean true s'il a confirmé la fiche bilan sinon false
	 */
	public function is_confirmeADC($idADC)
	{
		$bdd = PDO2::getInstance();
		$donnees = $bdd->query(
				' SELECT '.CONFIRM_FICHE_ADC.
				' FROM '.TABLE_PARTICIPE.
				' WHERE '.ID_ETU_PARTICIPE.' = '.$this->get_id().
				' AND '.ID_ADC_PARTICIPE.' = '.$idADC
		);
		$don = $donnees->fetch();
		if (is_null($don[CONFIRM_FICHE_ADC]))
			return true;
		else
			return false;

	}

	/**
	 * Permet de récupérer le rang d'un étudiant en liste d'attente d'une adc
	 * @param int $idADC L'identifiant de l'action de communication
	 * @return int
	 */
	public function rangAttenteADC($idADC)
	{
		$bdd = PDO2::getInstance();
		$rang = $bdd->query('SELECT '.RANG_ATTENTE_ADC.'
				FROM '.TABLE_ATTENTE_ADC.'
				WHERE '.ID_ADC_ATTENTE_ADC.' = '.$idADC.'
				AND '.ID_ETU_ATTENTE_ADC.' = '.$this->get_id());
		$rang = $rang->fetch();

		return $rang[RANG_ATTENTE_ADC];
	}
	/**
	 * Permet de savoir si l'étudiant est inscrit à la liste d'attente de l'action de communication passé en paramètre.
	 * @param int $idADC Identifiant de l'action de communication dont l'étudiant est susceptible de participer
	 * @return boolean true si l'étudiant est dans la liste d'attente sinon false
	 */
	public function is_attenteADC($idADC)
	{
		$bdd = PDO2::getInstance();
		$donnees = $bdd->query(	'
				SELECT COUNT(*)
				FROM '.TABLE_ATTENTE_ADC.'
				WHERE '.ID_ETU_ATTENTE_ADC.' = '.$this->get_id().'
				AND '.ID_ADC_ATTENTE_ADC.' = '.$idADC.'
				');
		if( $donnees->fetchColumn() > 0)
			return true;
		else
			return false;
	}

	/**
	 * Permet d'inscrire un étudiant à l'action de communication passé en paramétre
	 * @param int $idADC identifiant de l'action de communication
	 * @return boolean true si tout s'est bien passé, false sinon. La variable $_SESSION['message'] a été alimentée.
	 */
	public function inscrireADC($idADC)
	{
		$adc = new ActionDeCommunication($idADC);
		$adc->getOneADC();
		$bdd = PDO2::getInstance();
		$donnees = $bdd->query(	'
									INSERT INTO '.TABLE_PARTICIPE.'
									VALUES (\''.$idADC.'\', \''.$this->get_id().'\', NULL, NULL);
								');
		if($adc->get_nb_Etudiant_Max()==count($adc->get_etudiants_ADC()))
		{
			$result= $bdd->exec(
					'UPDATE '.TABLE_ADC.'
					SET '.CODE_ETAT.' = 2
					WHERE '.ID_ADC.' = '.$adc->get_id().'');
		}

		if(!$donnees)
			$_SESSION['message'] = 'Un problème est survenu lors de l\'inscription.';
		else
			$_SESSION['message'] = 'Vous avez bien été inscrit à l\'action de communication.';
	}

	/**
	 * Permet de désinscrire un étudiant de l'action de communication passé en paramètre
	 * @param int $idADC
	 * @return boolean true si tout s'est bien passé, false sinon. La varibable $_SESSION['message'] à été alimentée.
	 */
	public function desinscrireADC($idADC)
	{
		$bdd = PDO2::getInstance();
		$donnees = $bdd->query(	'
									DELETE FROM '.TABLE_PARTICIPE.'
									WHERE '.ID_ADC_PARTICIPE.' = '.$idADC.'
										AND '.ID_ETU_PARTICIPE.' = '.$this->get_id().'
								');

		$attente = $bdd->query(	'SELECT COUNT(*)
								FROM '.TABLE_ATTENTE_ADC.'
								WHERE '.ID_ADC_ATTENTE_ADC.' = '.$idADC);

		if( $attente->fetchColumn() > 0)
		{
			$etu = $bdd->query(	'SELECT '.ID_ETU_ATTENTE_ADC.'
									FROM '.TABLE_ATTENTE_ADC.'
									WHERE '.ID_ADC_ATTENTE_ADC.' = '.$idADC.'
									AND '.RANG_ATTENTE_ADC.' = 1');
			$etu = $etu->fetch();
			$etudiant = new Etudiants($etu[ID_ETU_ATTENTE_ADC]);
			$etudiant->inscrireADC($idADC);
			$etudiant->desinscrireAttenteADC($idADC);
			$adc = new ActionDeCommunication($idADC);
			$adc->getOneADC();
			$etudiant->envoyerMail("Inscription automatique à : ".$adc->get_titre(),"Bonjour,<br/>Vous avez été inscrit automatiquement à l'action ".$adc->get_titre()."<br/>Cordialement");
		}
		else
		{
			$result= $bdd->exec(
				'UPDATE '.TABLE_ADC.'
				SET '.CODE_ETAT.' = 1
				WHERE '.ID_ADC.' = '.$idADC.'');
		}

		if(!$donnees)
			$_SESSION['message'] = 'Une erreur est survenu lors de la description.';
		else
			$_SESSION['message'] = 'Vous avez bien été desinscrit de l\'action de communication';
	}


	/**
	 * Permet d'inscrire un étudiant en liste d'attente de l'action de communication passé en paramétre
	 * @param int $idADC identifiant de l'action de communication
	 * @return boolean true si tout s'est bien passé, false sinon. La variable $_SESSION['message'] a été alimentée.
	 */
	public function inscrireAttenteADC($idADC)
	{
		$bdd = PDO2::getInstance();
		$rang = $bdd->query('SELECT MAX('.RANG_ATTENTE_ADC.') as "'.RANG_ATTENTE_ADC.'"
						FROM '.TABLE_ATTENTE_ADC.'
						WHERE '.ID_ADC_ATTENTE_ADC.' = '.$idADC);

		$rang = $rang->fetch();

		if(is_null($rang[RANG_ATTENTE_ADC]))
			$r = 1;
		else
			$r = $rang[RANG_ATTENTE_ADC] + 1;

		$donnees = $bdd->query(	'INSERT INTO '.TABLE_ATTENTE_ADC.'
							VALUES (\''.$idADC.'\', \''.$this->get_id().'\', '.$r.')');

		if(!$donnees)
			$_SESSION['message'] = 'Un problème est survenu lors de l\'inscription à la liste d\'attente.';
		else
			$_SESSION['message'] = 'Vous avez bien été inscrit à la liste d\'attente.';
	}

	/**
	 * Permet de désinscrire un étudiant de la liste d'attente de l'action de communication passé en paramètre
	 * @param int $idADC
	 * @return boolean true si tout s'est bien passé, false sinon. La varibable $_SESSION['message'] à été alimentée.
	 */
	public function desinscrireAttenteADC($idADC)
	{
		$bdd = PDO2::getInstance();
		$rang = $this->rangAttenteADC($idADC);

		$donnees = $bdd->query(	'DELETE FROM '.TABLE_ATTENTE_ADC.'
								WHERE '.ID_ADC_ATTENTE_ADC.' = '.$idADC.'
								AND '.ID_ETU_ATTENTE_ADC.' = '.$this->get_id());

		$result= $bdd->exec('UPDATE '.TABLE_ATTENTE_ADC.'
							SET '.RANG_ATTENTE_ADC.' = '.RANG_ATTENTE_ADC.'-1
							WHERE '.ID_ADC_ATTENTE_ADC.' = '.$idADC.'
							AND '.RANG_ATTENTE_ADC.' > '.$rang);

		if(!$donnees)
			$_SESSION['message'] = ' erreur est survenu lors de la description à la liste d\'attente.';
		else
			$_SESSION['message'] = 'Vous avez bien été desinscrit de la liste d\'attente.';
	}

	/**
	 * Fonction permettant de récupérer toutes les notes de l'étudiant
	 */
	public function getNoteEtu()
	{
		$bdd = PDO2::getInstance();
		$donnees = $bdd->query(	'
									SELECT '.ID_ADC.', '.NOTE_PARTICIPE.'
									FROM '.TABLE_PARTICIPE.'
									WHERE '.ID_ETU_PARTICIPE.' = '.$this->get_id()
								);

		return $donnees->fetchAll();
	}
	/**
	 * Fonction permettant de récupérer une note spécifique de l'étudiant
	 */
	public function get_note($idadc)
	{
		$bdd = PDO2::getInstance();
		$donnees = $bdd->query(	'
									SELECT '.ID_ADC.', '.NOTE_PARTICIPE.'
									FROM '.TABLE_PARTICIPE.'
									WHERE '.ID_ETU_PARTICIPE.' = '.$this->get_id().'
										AND '.ID_ADC_PARTICIPE.' = '.$idadc
		);
		$donnees = $donnees->fetch();
		return $donnees[NOTE_PARTICIPE];
	}

	/**
	 *
	 * @param string $objet
	 * @param string $message
	 */
	public function envoyerMail($objet,$message)
	{
// 		envoyerMail("alexandre.lesage@etu.univ-savoie.fr", "teste", $destinataire, $corps, "Rappel : Participation à une Actionde Communication");
	}

	/*Getters et Setters*/

	/**
	 * Fonction permettant de récupérer l'id de l'étudiant
	 * @return int
	 */
	public function get_id()
	{
		return $this->_id;
	}

	/**
	 * Fonction permettant de modifier l'id de l'étudiant
	 * @param int
	 */
	public function set_id($id)
	{
		$this->_id=$id;
	}

	/**
	 * Fonction permettant de récupérer le login de l'étudiant
	 * @return string
	 */
	public function get_login()
	{
		return $this->_login;
	}

	/**
	 * Fonction permettant de modifier le login de l'étudiant
	 * @param string
	 */
	public function set_login($login)
	{
		$this->_login=$login;
	}

	/**
	 * Fonction permettant de récupérer le nom de l'étudiant
	 * @return string
	 */
	public function get_nom()
	{
		return $this->_nom;
	}

	/**
	 * Fonction permettant de modifier le nom de l'étudiant
	 * @param string
	 */
	public function set_nom($nom)
	{
		$this->_nom=$nom;
	}

	/**
	 * Fonction permettant de récupérer le prénom de l'étudiant
	 * @return string
	 */
	public function get_prenom()
	{
		return $this->_prenom;
	}

	/**
	 * Fonction permettant de modifier le prenom de l'étudiant
	 * @param string
	 */
	public function set_prenom($prenom)
	{
		$this->_prenom=$prenom;
	}

	/**
	 * Fonction permettant de récupérer le TD de l'étudiant
	 * @return string
	 */
	public function get_td()
	{
		return $this->_td;
	}

	/**
	 * Fonction permettant de modifier le TD de l'étudiant
	 * @param string
	 */
	public function set_td($td)
	{
		$this->_td=$td;
	}

	/**
	 * Fonction permettant de récupérer année de la promos de l'étudiant
	 * @return int
	 */
	public function get_annee()
	{
		return $this->_annee;
	}

	/**
	 * Fonction permettant de modifier année de la promos de l'étudiant
	 * @param int
	 */
	public function set_annee($annee)
	{
		$this->_annee=$annee;
	}

	/**
	 * Fonction permettant de récupérer le mail de l'étudiant
	 * @return string
	 */
	public function get_mail()
	{
		return $this->_mail;
	}

	/**
	 * Fonction permettant de modifier le mail de l'étudiant
	 * @param string
	 */
	public function set_mail($mail)
	{
		$this->_mail=$mail;
	}

}
?>